/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.ArrayList;
import java.util.List;
import libcontrol.model.Devolucao;
import libcontrol.model.Exemplar;
import libcontrol.model.Obra;

/**
 *
 * @author filipe
 */
public class DaoObra extends Dao<Obra> {

    public DaoObra() {
        super(Obra.class);
    }

    public Obra findByTituloAndAutorAndEdicaoAndEditora(String titulo, String autor, int edicao, String editora) {
        List<Obra> resultList = criteria.andStringLike("titulo", "%" + titulo + "%")
                .andStringLike("autor", "%" + autor + "%")
                .andEquals("edicao", edicao)
                .andStringLike("editora", "%" + editora + "%")
                .getResultList();
        return resultList.isEmpty() ? null : resultList.get(0);
    }

    public List<Obra> listByTituloAndAutorAndEdicaoAndEditora(String titulo, String autor, int edicao, String editora) {
        return criteria.andStringLike("titulo", "%" + titulo + "%")
                .andStringLike("autor", "%" + autor + "%")
                .andEquals("edicao", edicao)
                .andStringLike("editora", "%" + editora + "%")
                .getResultList();
    }

    public List<Obra> listByTituloAndAutorAndEditora(String titulo, String autor, String editora) {
        return criteria.andStringLike("titulo", "%" + titulo + "%")
                .andStringLike("autor", "%" + autor)
                .andStringLike("editora", "%" + editora)
                .getResultList();
    }

    public List<Obra> findAllEmprestadas() {
        ArrayList<Obra> resultList = new ArrayList<>();
        for (Obra obra : criteria.getResultList()) {
            if (obra.hasEmprestimos()) {
                resultList.add(obra);
            }
        }
        return resultList;
    }

    public List<Obra> findAllReservadas() {
        ArrayList<Obra> resultList = new ArrayList<>();
        for (Obra obra : criteria.getResultList()) {
            if (obra.hasReservas()) {
                resultList.add(obra);
            }
        }
        return resultList;
    }

    public List<Obra> findAllDevolucaoAtrasadas() {
        ArrayList<Obra> resultList = new ArrayList<>();
        for (Obra obra : criteria.getResultList()) {
            for (Exemplar exemplar : obra.getExemplaresAtivos()) {
                for (Devolucao devolucao : exemplar.getDevolucoes()) {
                    if (devolucao.isAtrasada()) {
                        resultList.add(obra);
                    }
                }
            }
        }
        return resultList;
    }

    public List<Obra> findAllMaisRetiradas() {
        return null;
    }
}
